🎢 Halo Orbits & Invariant Manifolds
Invariant manifolds about Halo orbits and their applications in the Circular Restricted Three-body Problem.
Joe Carpinelli
December,
ENAE
Final Project
Presentation Mode:
📋 Project Overview
In the context of astrodynamics, manifolds are groups of trajectories that move toward or away from Lagrange points. To use invariant manifolds for interplanetary travel, several concepts must be developed and built on: lagrange points, periodic and quasi-periodic orbits within the Circular Restricted Three-body Problem, and manifolds about periodic orbits
Outline
Brief review of Lagrange points
Periodic orbits (specifically, the subsection known as Halo orbits)
Finding Halo orbits (both analytically, and numerically)
Invariant manifolds about Halo orbits
Primary Reference
Megan Rund's Masters Thesis at California Polytechnic State University
Lagrange Points
Lagrange points are equilibrium points within the Circular Restricted Three-body Problem
Stability at Lagrange Points
Like equilibrium points for all nonlinear systems, Lagrange points can be stable or unstable
We can find the stability of an equilibrium point by analysing eigenvalues of the Jacobian of the state vector
In the
Stability at Lagrange Points: Examples
Earth-Moon L4 is stable, and Earth-Moon L2 is unstable
)
Periodic Orbits
Libration Orbit Families
Orbits about Lagrange points are known as Libration orbits
Lyapunov orbits are two-dimensional Libration orbits
Lissajous orbits are three-dimensional, semi-periodic Libration orbits
Halo orbits are three-dimensional, theoretically periodic Libration orbits
Finding Halo Orbits
The calculations required to solve for Halo orbits are numerically sensitive
We covered the procedure for iteratively solving for Halo orbits numerically in Lecture 16; this requires an initial guess
How do we find an initial guess for a Halo orbit?
😇 Analytical Halo Solution
The Circular Restricted Three-body Dynamics can be derived using "Legendre poly- nomials", and there exists a third-order approximation (shown below)
We can choose parameters to remove unstable (secular) terms from the expansion
Third Order CR3BP Expansion
Algorithm Inputs
Nondimensional mass parameter
Nondimensional
amplitude for the desired Halo orbitLagrange point to orbit (L1 or L2)
Algorithm Outputs
Position vector
Velocity vector
Estimated orbital period
Analytical Halo Examples: Earth-Moon L2
NOT numerically propagated!
Analytical Halo Examples: Sun-Jupiter L1
NOT numerically propagated!
🧮 Numerical Halo Solution
As discussed in Lecture 16, we can append the state transition matrix
to our state vector, and iteratively change initial conditions to numerically find a periodic orbit
Propagate until
again; where , is the matrix of second partial derivatives of potentialCalculate
Set
, and jump back to Step 1 (until , are both within some tolerance of zero)
🎢 Dynamics along Halo Orbits
Manifolds Exist
Each point along a Halo orbit is connected with an unstable manifold, and a stable manifold
The unstable manifold departs the Halo orbit, and the stable manifold arrives at the Halo orbit
How can we calculate the perturbation required to shift the spacecraft onto the manifold?
Finding Manifolds
We can use Eigenvectors of the Jacobian to calculate a state perturbation which will place the spacecraft onto a manifold at each point along the Halo orbit
Propagate the Halo orbit for one period
, including the state transition matrixLet the final state transition matrix be
;Calculate eigenvectors
, andFor each point
along the Halo orbit... , and , and
Invariant Manifold Example
Pulled from Rund's Thesis
Note that stable manifolds need to be propagated backward in time from the perturbation along the Halo orbit, becuase they converge on the Halo orbit
🪐 Manifold-based Transfer Designs
Design Overview summarized from
Design Overview
Find a desired Sun-Earth Halo orbit
Place the spacecraft within the stable manifold of this Halo orbit
Perturb the spacecraft from the Halo onto the unstable manifold to return towards Earth, and apply a maneuver to place the spacecraft on a Hyperbolic escape trajectory toward your destination planet
At destination planet, apply a maneuver to place spacecraft onto stable manifold of destination Halo orbit
🚀 Conclusions
Manifold Transfers
Lagrange points, and periodic orbits about Lagrange points are surrounded by collections of trajectories called manifolds
Manifolds can depart, or arrive at the Lagrange point / Libration orbit
Stable manifolds can bring us to Halo orbits for free
(plus the cost to place the spacecraft onto the manifold)
Lessons Learned
Linear (Eigenvector) analysis works in Astrodynamics too
Calculations for iterating on Halo orbits are extremely numerically sensitive
Even with more complicated models (CR3BP), we need a patch-conic-like approach for interplanetary mission design
📚 References
⌨️ Source Code
Package Dependencies
The following packages were used – all are available in Julia's General package registry
xxxxxxxxxxbegin using Plots using Roots using PlutoUI using Latexify using StaticArrays using LinearAlgebra using ModelingToolkit using UnitfulAstrodynamics using DifferentialEquations μ = nondimensionalize(Earth.μ, Moon.μ)end;Finding Lagrange Points
xxxxxxxxxxf₁ = let f₁ = lagrangeplot(nondimensionalize(Earth.μ, Moon.μ); labels=["Earth" "Moon"]) savefig(f₁, "media/fig1.png") f₁ end;Unstable Lagrange Point (L2)
xxxxxxxxxxf₂ = let μ = nondimensionalize(Earth.μ, Moon.μ) r = lagrange(μ, 2)[:] v = [0.0, 0.0, 0.0] sys = NondimensionalThreeBodyState(r, v, μ, NaN * u"km", NaN * u"s") sols = propagate(sys, 30; save_everystep=true, reltol=1e-16, abstol=1e-16) x = [sols.step[i].rₛ[1] for i ∈ 1:length(sols.step)] y = [sols.step[i].rₛ[2] for i ∈ 1:length(sols.step)] z = [sols.step[i].rₛ[3] for i ∈ 1:length(sols.step)] f₂ = plot(x,y; label="Spacecraft Position") scatter!(f₂, [[i] for i ∈ lagrange(μ, 2)[1:2]]...; label="L2", markershape=:x) scatter!(f₂, [[i] for i ∈ sys.r₁][1:2]...; label="Earth", markersize=7) scatter!(f₂, [[i] for i ∈ sys.r₂][1:2]...; label="Moon") plot!(f₂; title="Spacecraft Propagated from Earth-Moon L2", xlabel="X (AU)", ylabel="Y (AU)") savefig(f₂, "media/fig2.png") f₂ end;Stable Lagrange Point (L4)
xxxxxxxxxxf₇ = let μ = nondimensionalize(Earth.μ, Moon.μ) r = lagrange(μ, 4)[:] * (1 + 1e-3) v = [0.0, 0.0, 0.0] sys = NondimensionalThreeBodyState(r, v, μ, NaN * u"km", NaN * u"s") sols = propagate(sys, 1000; save_everystep=true, reltol=1e-16, abstol=1e-16) x = [sols.step[i].rₛ[1] for i ∈ 1:length(sols.step)] y = [sols.step[i].rₛ[2] for i ∈ 1:length(sols.step)] z = [sols.step[i].rₛ[3] for i ∈ 1:length(sols.step)] f₇ = plot(x,y; label="Spacecraft Position") scatter!(f₇, [[i] for i ∈ lagrange(μ, 4)[1:2]]...; label="L4", markershape=:x) scatter!(f₇, [[i] for i ∈ sys.r₁][1:2]...; label="Earth", markersize=7) scatter!(f₇, [[i] for i ∈ sys.r₂][1:2]...; label="Moon") plot!(f₇; title="Spacecraft Perturbed from Earth-Moon L4", xlabel="X (AU)", ylabel="Y (AU)") savefig(f₂, "media/fig2.png") f₇ end;Plot Analytical Halo Orbit
xxxxxxxxxxfunction haloplot(μ, L, Z, H, str1="Mass 1", str2="Mass 2"; kwargs...) if L==:L1 l = 1 else l = 2 end defaults = (; title="Analytical Halo Solutions", xlabel="X (DU)", ylabel="Y (DU)", zlabel="Z (DU)") options = merge(defaults, kwargs) fig = plot(; options...) for z ∈ Z r,v,Τ = halo_analytic(μ; L=L, Zₐ=z, hemisphere=H, steps=1000) x = r[:,1] y = r[:,2] z = r[:,3] plot!(fig, x, y, z; label=:none) end scatter!(fig, [[v] for v ∈ lagrange(μ, l)]...; label=string("L",L), markershape=:x) scatter!(fig, [-μ], [0], [0]; label=str1) scatter!(fig, [1-μ], [0], [0]; label=str2) return fig end;Northern Sun-Jupiter Halos
xxxxxxxxxxf₃ = let μ = nondimensionalize(Sun.μ, Jupiter.μ) Z = [x / 10 for x ∈ 1:10] f₃ = haloplot(μ, 1, Z, :northern, "Sun", "Jupiter"; title="Northern Analytical Halo Solutions") savefig(f₃, "media/fig3.png") f₃ end;Southern Sun-Jupiter Halos
xxxxxxxxxxf₄ = let μ = nondimensionalize(Sun.μ, Jupiter.μ) Z = [x / 10 for x ∈ 1:10] f₄ = haloplot(μ, 1, Z, :southern, "Sun", "Jupiter"; title="Southern Analytical Halo Solutions") savefig(f₄, "media/fig4.png") f₄ end;Northern Earth-Moon Halos
xxxxxxxxxxf₅ = let μ = nondimensionalize(Earth.μ, Moon.μ) Z = [x / 10 for x ∈ 1:10] f₅ = haloplot(μ, 2, Z, :northern, "Earth", "Moon"; title="Northern Analytical Halo Solutions") savefig(f₅, "media/fig5.png") f₅ end;Southern Earth-Moon Halos
xxxxxxxxxxf₆ = let μ = nondimensionalize(Earth.μ, Moon.μ) Z = [x / 10 for x ∈ 1:10] f₆ = haloplot(μ, 2, Z, :southern, "Earth", "Moon"; title="Southern Analytical Halo Solutions") savefig(f₆, "media/fig6.png") f₆ end;Numerically Produced Halo
xxxxxxxxxxf₈ = let r,v,T = halo(μ, L=2, Zₐ=0.05, ϕ=0.05, max_iter=20) sys = NondimensionalThreeBodyState(r,v,μ, NaN*u"km", NaN*u"s") sols = propagate(sys, T) x = [x.rₛ[1] for x ∈ sols.step] y = [x.rₛ[2] for x ∈ sols.step] z = [x.rₛ[3] for x ∈ sols.step] f₈ = plot(x,y,z; label="Spacecraft Position") plot!(f₈; title="Numerically Produced Earth-Moon L2 Halo", xlabel="X (DU)", ylabel="Y (DU)", zlabel="Z (DU)") savefig(f₈, "media/fig8.png") f₈ end;